package com.tistory.wonsama.web;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import com.tistory.wonsama.util.WFile;
import com.tistory.wonsama.util.WLog;

/**
 * 웹 파싱 관련 클래스
 * @author wonsama
 * @since 2012.01.06
 */
public class WUrlLoader  {

	private static final int DEFAULT_WRITE_BYTE  = 1024;
	private static final int DEFAULT_READ_BYTE  = 1024 * 10;		//오류가 발생할 수도 있음에 유의 : out of index
	
	private static int READ_BYTE = DEFAULT_READ_BYTE;

	
	/**
	 * <pre>
	 * LOAD 시 읽어들이는 크기를 변경한다
	 * 왠만하면 사용하지 않아도 됨.
	 * </pre> 
	 * @param readByte 크기
	 * @since 2012.01.06
	 */
	@Deprecated
	public static void changeReadByte( int readByte )
	{
		READ_BYTE = readByte;
	}
	
	/**
	 * 파일을 다운로드 한다 
	 * @param url 경로 
	 * @param filePath 저장 파일 위치 
	 * @return 파일 
	 * @throws Exception 오류
	 * @since 2012.01.06
	 */
	public static File download( String url , String filePath ) throws Exception
	{
		int ch = 0;
		int k = 0;
		byte[] temp = null;
		String str = null;

		URL u = null;
		URLConnection con  = null;
		InputStream in  = null;

		try {
			u = new URL( url );
			con = u.openConnection();
			in = con.getInputStream();
		} catch (Exception e) {
			WLog.debug( "[ Error ] : WUrlLoader.download [ init ] : " + e.toString() );
			throw new Exception( "[ Error ] : WUrlLoader.download [ init ]  : " + e.toString() );
		}
		
		//MAKE DIR
		WFile.mkDir( filePath );
		
		File file = new File( filePath );
		OutputStream os = null;
		
		try{
			os = new FileOutputStream( file );
			
			//WRITE
			int read;
			byte readByte[] = new byte[ DEFAULT_WRITE_BYTE ];
			while ( ( read = in.read(readByte, 0, DEFAULT_WRITE_BYTE ) ) != -1) {  
				os.write(readByte, 0, read);  
			} 

			//CLOSE
			if( os!=null ) os.close();
			if( in!=null ) in.close();
			
		}catch (Exception e) {
			WLog.debug( "[ Error ] : WUrlLoader.download [ file ] : " + e.toString() );
			throw new Exception( "[ Error ] : WUrlLoader.download [ file ]  : " + e.toString() );
		}
		
		return file;
	}
	
	/**
	 * 웹 정보를 파싱하여 라인 단위 목록 정보를 생성한다 
	 * @param url 주소
	 * @return 파싱결과 
	 * @throws Exception 오류 
	 * @since 2012.01.06
	 */
	public static List<String> load( String url ) throws Exception
	{
		int ch = 0;
		int k = 0;
		byte[] temp = null;
		String str = null;

		URL u = null;
		URLConnection con  = null;
		InputStream in  = null;
		
		try {
			u = new URL( url );
			con = u.openConnection();
			in = con.getInputStream();
		} catch (Exception e) {
			WLog.debug( "[ Error ] : WUrlLoader.load [ init ] : " + e.toString() );
			throw new Exception( "[ Error ] : WUrlLoader.load [ init ]  : " + e.toString() );
		}

		ArrayList<String> list = new ArrayList<String>();
		try{
			while (ch != -1) {
				temp = new byte[ READ_BYTE ];
				k = 0;   
				while ((ch = in.read()) != -1 && (ch != '\n') ) {
					temp[k] = (byte) ch;
					k++;
				}
				str = new String(temp, 0, k);
				list.add( str );
			}

			if(in!=null) in.close();

		}catch (IOException e) {
			WLog.debug( "[ Error ] : WUrlLoader.load [ read ]  : " + e.toString() );
			throw new Exception( "[ Error ] : WUrlLoader.load [ read ]  : " + e.toString() );
		}

		return list;
	}

}
